/*
 * Copyright 2008-2023 dexian.vip. All rights reserved.
 * Support: http://www.dexian.vip
 * License: http://www.dexian.vip/license
 */

package vip.dexian.common.query;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.io.Serial;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 分页结果
 *
 * @author 挺好的 2023年05月30日 18:49
 */
@Data
@EqualsAndHashCode (callSuper = false)
public class Page<T extends Serializable> implements Serializable {

    @Serial
    private static final long serialVersionUID = -3176551602446549693L;

    /**
     * 分页实际的数据内容。默认是空list
     */
    private List <T> content = new ArrayList <>();

    /**
     * 共有多少条
     */
    private long total;

    /**
     * 分页条件
     */
    @JsonIgnore
    private Pageable pageable;

    public Page () {
        this.total    = 0L;
        this.pageable = new Pageable();
    }

    /**
     * 创建一个分页结果
     *
     * @param content
     *         内容
     * @param total
     *         共有多少条
     * @param pageable
     *         分页条件
     */
    public Page (List <T> content, long total, Pageable pageable) {
        this.content.addAll(content);
        this.total    = total;
        this.pageable = pageable;
    }

    /**
     * 获取当前第几页
     *
     * @return 当前第几页
     */
    public int getPageNumber () {
        return this.pageable.getPageNumber();
    }

    /**
     * 每页显示多少条
     *
     * @return 每页显示多少条
     */
    public int getPageSize () {
        return this.pageable.getPageSize();
    }

    /**
     * 返回一个空的分页结果
     *
     * @param pageable
     *         分页条件
     * @param <T>
     *         分页数据内容
     *
     * @return {@link vip.dexian.common.query.Page}
     */
    public static <T extends Serializable> Page <T> emptyPage (Pageable pageable) {
        return new Page <>(Collections.emptyList(), 0L, pageable);
    }

    /**
     * 计算共有多少页
     *
     * @return 一共多少页
     */
    public int getTotalPages () {
        return (int) Math.ceil((double) this.getTotal() / this.getPageSize());
    }

}
